package com.studentstreet;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.studentstreet.adapter.CommentAdapter;
import com.studentstreet.component.AbstractCommonActivity;
import com.studentstreet.component.LoadStateView;
import com.studentstreet.entities.CommentEntity;
import com.studentstreet.tools.HttpHelper;
import com.studentstreet.tools.PreferenceTools;
import com.studentstreet.tools.Util;
import com.studentstreet.tools.dbhelper.CommentDBHelper;

/**
 * @author likebamboo
 * 
 */
public class CommentList extends AbstractCommonActivity {
	// Title标题
	private TextView titleText;
	// Login Button登录按钮
	private Button login_bt;
	// 头部左边的按钮
	private ImageButton backImgBt = null;
	// 商品评论列表控件
	private ListView commentListView = null;
	// 商品评论列表实体
	private List<CommentEntity> commentEntityList = null;
	// 商品列表适配器
	private CommentAdapter adapter = null;
	// LoadStateView是一个自写的组件，继承于RelativeLayout，可实现不同状态的布局
	private LoadStateView loadStateView;
	// 商品ID，从上个Activity传过来的
	private String goodsId = "";
	// 商品名，从上个Activity传过来的
	private String goodsName = "";
	// 商品列表ListView的页脚部分，可实现分页加载的显示情况
	private View footer;
	// 此次加载是否完成
	boolean loadfinish = true;

	// 用于网络操作
	private static final int REFRESH_LIST = 0x10001;
	private static final int SHOW_LOAD_STATE_VIEW = 0x10003;
	private static final int HIDE_LOAD_STATE_VIEW = 0x10004;
	private static final int LIST_IS_EMPTY = 0x10005;

	// 每页显示的数量
	int pageSize = 10;
	// 当前为第几页（从第0页开始）
	int page = 0;
	// 是不是将服务器上的数据全部加载完成了
	boolean isEnd = false;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.comments);
		// 将当前Activity压入堆栈中
		MyApp.getInstance().addActivity(this);
		// 获得上个Activity传来的数据
		Intent intent = getIntent();
		goodsId = intent.getStringExtra("goods_id");
		goodsName = intent.getStringExtra("goods_name");
		initHeader();
		// 初始化各个布局
		commentListView = (ListView) findViewById(R.id.comment_list);
		loadStateView = (LoadStateView) findViewById(R.id.downloadStatusBox);
		adapter = new CommentAdapter(this);
		// 实例化底部布局
		footer = getLayoutInflater().inflate(R.layout.footer, null);
		// 添加ListView的页脚部分（这个一定要在添加适配器前面）
		commentListView.addFooterView(footer);
		// 添加适配器
		commentListView.setAdapter(adapter);
		// 显示数据完成后 取消footer提示
		commentListView.removeFooterView(footer);
		// 添加滑动事件监听器
		commentListView.setOnScrollListener(new ScrollListener());
		// 加载评论信息
		loadComment();
	}

	private void initHeader() {
		// 返回按钮
		backImgBt = (ImageButton) findViewById(R.id.header_imgBt);
		// 头部中间的标题
		titleText = (TextView) findViewById(R.id.title);
		// 登录按钮
		login_bt = (Button) findViewById(R.id.login_bt);
		// 返回按钮
		backImgBt.setImageResource(R.drawable.back);
		backImgBt.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		// 头部中间的标题
		titleText.setText(getResources().getString(R.string.comment_goods,
				goodsName));
		// 登录按钮
		login_bt.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// 显示登录对话框
				Intent intent = new Intent(CommentList.this, LoginDialog.class);
				startActivity(intent);
			}
		});
	}

	// 加载评论
	private void loadComment() {
		// 开启一条线程 提供新数据
		new Thread(new Runnable() {
			@Override
			public void run() {
				String commentJson = "";
				// 从服务器端下载商品Json数据
				HttpHelper helper = new HttpHelper(Util.BASE_URL
						+ "/servlet/CommentServlet");
				// 添加参数
				helper.addParam("action", "get");
				helper.addParam("goods_id", goodsId);
				helper.addParam("start", page * pageSize + "");
				helper.addParam("count", pageSize + "");
				// 获得服务器返回的数据
				commentJson = helper.getResponse();
				if ("".equals(commentJson)) {
					// 数据为空
					sendMessage(LIST_IS_EMPTY);
					return;
				}
				// 先休眠一会
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				// 将数据填充到适配器adapter中
				fillDate(commentJson);
				// 发送消息，更新布局
				sendMessage(REFRESH_LIST);
			}
		}).start();
	}

	// 将下载的Json数据转化为 CommentEntity列表，并填充到适配器adapter中
	public void fillDate(String jsonString) {
		if (jsonString.equals("")) {
			return;// 应从本地数据库读，暂时不实现；
		}
		// 将数据保存到本地数据库
		CommentDBHelper dbHelper = new CommentDBHelper(this);
		dbHelper.saveToDB(jsonString);
		// 填充adapter
		Type listType = new TypeToken<ArrayList<CommentEntity>>() {
		}.getType();
		// 创建Gson 对象
		Gson gson = new Gson();
		// 将Json数据转化为List<CommentEntity>
		commentEntityList = gson.fromJson(jsonString, listType);
		// 当服务器上传过来的评论列表数据小于一个页面的大小时，表示已经加载完成了
		if (commentEntityList.size() < pageSize) {
			isEnd = true;
		}
		for (int i = 0; i < commentEntityList.size(); i++) {
			CommentEntity com = commentEntityList.get(i);
			// 将CommentEntity中的数据填充到适配器中
			adapter.addComment(com.getUser_name(), com.getTime(),
					com.getContent(), com.getRank());
		}
		// 页数加1
		page++;
	}

	@Override
	protected void handleOtherMessage(int flag) {
		switch (flag) {
		case REFRESH_LIST:
			// 更新列表
			adapter.notifyDataSetChanged();
			// 加载完成
			loadfinish = true;
			// 如果存在 页脚 则去掉页脚
			if (commentListView.getFooterViewsCount() > 0) {
				commentListView.removeFooterView(footer);
			}
			// 针对第一次加载
			// 加载完成，让ProgressBar消失
			loadStateView.stopLoad();
			// 如果列表为空，显示提示为空的信息
			if (adapter.getCount() == 0) {
				loadStateView.showEmpty();
			}
			break;
		case SHOW_LOAD_STATE_VIEW:
			loadStateView.startLoad();
			break;
		case HIDE_LOAD_STATE_VIEW:
			loadStateView.stopLoad();
			break;
		case LIST_IS_EMPTY:
			// 让ProgressBar消失
			loadStateView.stopLoad();
			// 显示网络错误
			loadStateView.showError();
			break;
		default:
			break;
		}

	}

	@Override
	protected void onResume() {
		super.onResume();
		PreferenceTools prefTools = new PreferenceTools(this);
		// 判断是否已经登录
		if (!prefTools.isLogin()) {
			return;
		}
		// 登录后修改登录按钮上的text
		String userName = prefTools.getUserName();
		if (!userName.equals("")) {
			login_bt.setText(userName);
			// 去掉登录按钮文本右边的图标
			login_bt.setCompoundDrawablesWithIntrinsicBounds(null, null, null,
					null);
		}
	}

	// 处理滑动事件的类
	private final class ScrollListener implements OnScrollListener {
		// 滑动事件
		@Override
		public void onScroll(AbsListView view, int firstVisibleItem,
				int visibleItemCount, int totalItemCount) {
			// 获取当前屏幕最后的Item的Id
			int lastItemid = commentListView.getLastVisiblePosition();
			// 达到数据的最后一条记录
			if ((lastItemid + 1) == totalItemCount) {
				if (isEnd) {
					// 如果加载完毕，则显示提示信息
					TextView v = (TextView) footer
							.findViewById(R.id.footer_text);
					v.setText(getResources().getString(R.string.loadAll));
					ProgressBar bar = (ProgressBar) footer
							.findViewById(R.id.footer_progressBar);
					bar.setVisibility(View.GONE);
					if (commentListView.getFooterViewsCount() == 0) {
						commentListView.addFooterView(footer);
					}
					return;
				}
				if (totalItemCount > 0 && loadfinish) {
					// 进来后 马上改变状态
					loadfinish = false;
					// 添加页脚
					commentListView.addFooterView(footer);
					// 从网上加载新一页的评论信息
					loadComment();
				}
			}
		}

		@Override
		public void onScrollStateChanged(AbsListView view, int scrollState) {
		}

	}
}
